Add a style class for context menus
authorMatthias Clasen <mclasen@redhat.com>
Sun, 18 Aug 2013 14:45:24 +0000 (10:45 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 18 Aug 2013 17:46:48 +0000 (13:46 -0400)
Attached widgets inherit from the style of the widget they are
attached to. This can sometimes have unintended consequences,
like a context menu in the main view of gedit inheriting the font
that is configured for documents, or the context menu of the preview
in the font chooser coming up with humongous font size.

To fix this problem, we introduce a context menu style class
and use it for all menus that are used like that. The theme
can then set a font for this style class.

https://bugzilla.gnome.org/show_bug.cgi?id=697127

gtk/gtkcolorswatch.c
gtk/gtkentry.c
gtk/gtklabel.c
gtk/gtklinkbutton.c
gtk/gtkmountoperation.c
gtk/gtknotebook.c
gtk/gtkplacessidebar.c
gtk/gtkstylecontext.h
gtk/gtktextview.c
gtk/gtktoolbar.c
gtk/gtkwindow.c

index a4073fd781523c9246d1b3e180fe3937a17ad592..e2017a97a75285040a96e32e0658d5cb2ec36f83 100644 (file)
@@ -441,6 +441,9 @@ do_popup (GtkWidget      *swatch,
   GtkWidget *item;
 
   menu = gtk_menu_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (menu),
+                               GTK_STYLE_CLASS_CONTEXT_MENU);
+
   item = gtk_menu_item_new_with_mnemonic (_("_Customize"));
   gtk_menu_attach_to_widget (GTK_MENU (menu), swatch, NULL);
 
index 7df65389761c0a914b402c87c0bc5042b736005a..76bb87409d52bf2cff9cea674329713260b2124a 100644 (file)
@@ -9225,60 +9225,61 @@ popup_targets_received (GtkClipboard     *clipboard,
     {
       DisplayMode mode;
       gboolean clipboard_contains_text;
+      GtkWidget *menu;
       GtkWidget *menuitem;
 
       clipboard_contains_text = gtk_selection_data_targets_include_text (data);
       if (info_entry_priv->popup_menu)
        gtk_widget_destroy (info_entry_priv->popup_menu);
 
-      info_entry_priv->popup_menu = gtk_menu_new ();
+      info_entry_priv->popup_menu = menu = gtk_menu_new ();
+      gtk_style_context_add_class (gtk_widget_get_style_context (menu),
+                                   GTK_STYLE_CLASS_CONTEXT_MENU);
 
-      gtk_menu_attach_to_widget (GTK_MENU (info_entry_priv->popup_menu),
-                                GTK_WIDGET (entry),
-                                popup_menu_detach);
+      gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (entry), popup_menu_detach);
 
       mode = gtk_entry_get_display_mode (entry);
-      append_action_signal (entry, info_entry_priv->popup_menu, _("Cu_t"), "cut-clipboard",
+      append_action_signal (entry, menu, _("Cu_t"), "cut-clipboard",
                             info_entry_priv->editable && mode == DISPLAY_NORMAL &&
                             info_entry_priv->current_pos != info_entry_priv->selection_bound);
 
-      append_action_signal (entry, info_entry_priv->popup_menu, _("_Copy"), "copy-clipboard",
+      append_action_signal (entry, menu, _("_Copy"), "copy-clipboard",
                             mode == DISPLAY_NORMAL &&
                             info_entry_priv->current_pos != info_entry_priv->selection_bound);
 
-      append_action_signal (entry, info_entry_priv->popup_menu, _("_Paste"), "paste-clipboard",
+      append_action_signal (entry, menu, _("_Paste"), "paste-clipboard",
                             info_entry_priv->editable && clipboard_contains_text);
 
       menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete"));
       gtk_widget_set_sensitive (menuitem, info_entry_priv->editable && info_entry_priv->current_pos != info_entry_priv->selection_bound);
       g_signal_connect_swapped (menuitem, "activate",
-                               G_CALLBACK (gtk_entry_delete_cb), entry);
+                                G_CALLBACK (gtk_entry_delete_cb), entry);
       gtk_widget_show (menuitem);
-      gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem);
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
       menuitem = gtk_separator_menu_item_new ();
       gtk_widget_show (menuitem);
-      gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem);
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
       menuitem = gtk_menu_item_new_with_mnemonic (_("Select _All"));
       gtk_widget_set_sensitive (menuitem, gtk_entry_buffer_get_length (info_entry_priv->buffer) > 0);
       g_signal_connect_swapped (menuitem, "activate",
-                               G_CALLBACK (gtk_entry_select_all), entry);
+                                G_CALLBACK (gtk_entry_select_all), entry);
       gtk_widget_show (menuitem);
-      gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem);
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
-      g_signal_emit (entry, signals[POPULATE_POPUP], 0, info_entry_priv->popup_menu);
+      g_signal_emit (entry, signals[POPULATE_POPUP], 0, menu);
 
       if (info->device)
-       gtk_menu_popup_for_device (GTK_MENU (info_entry_priv->popup_menu),
-                        info->device, NULL, NULL, NULL, NULL, NULL,
-                       info->button, info->time);
+       gtk_menu_popup_for_device (GTK_MENU (menu),
+                                   info->device, NULL, NULL, NULL, NULL, NULL,
+                                   info->button, info->time);
       else
        {
-         gtk_menu_popup (GTK_MENU (info_entry_priv->popup_menu), NULL, NULL,
-                         popup_position_func, entry,
-                         0, gtk_get_current_event_time ());
-         gtk_menu_shell_select_first (GTK_MENU_SHELL (info_entry_priv->popup_menu), FALSE);
+          gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+                          popup_position_func, entry,
+                          0, gtk_get_current_event_time ());
+          gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
        }
     }
 
index f8abece13f09edd1379654d8fd11a5dd8348427e..b268c4e92aa1dec31cbc6acbf2eddc216b9974ce 100644 (file)
@@ -6204,6 +6204,8 @@ gtk_label_do_popup (GtkLabel       *label,
     gtk_widget_destroy (priv->select_info->popup_menu);
 
   priv->select_info->popup_menu = menu = gtk_menu_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (menu),
+                               GTK_STYLE_CLASS_CONTEXT_MENU);
 
   gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (label), popup_menu_detach);
 
index 461e37e814e45d8ef0c2a9da1f9c9a18b7e49865..9260b79268ed776d8b2d67c9ee37e6a27cefcaef 100644 (file)
@@ -480,12 +480,14 @@ gtk_link_button_do_popup (GtkLinkButton  *link_button,
   if (gtk_widget_get_realized (GTK_WIDGET (link_button)))
     {
       GtkWidget *menu_item;
-      
+
       if (priv->popup_menu)
        gtk_widget_destroy (priv->popup_menu);
 
       priv->popup_menu = gtk_menu_new ();
-      
+      gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu),
+                                   GTK_STYLE_CLASS_CONTEXT_MENU);
+
       gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu),
                                 GTK_WIDGET (link_button),
                                 popup_menu_detach);
@@ -495,7 +497,7 @@ gtk_link_button_do_popup (GtkLinkButton  *link_button,
                        G_CALLBACK (copy_activate_cb), link_button);
       gtk_widget_show (menu_item);
       gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menu_item);
-      
+
       if (button)
         gtk_menu_popup (GTK_MENU (priv->popup_menu), NULL, NULL,
                        NULL, NULL,
index f64d7a143916f23b30d1b3c204f9b14fc5f2c9ef..65f994c7ebb8532bfaf93adf8544f695458921d3 100644 (file)
@@ -1291,6 +1291,8 @@ do_popup_menu_for_process_tree_view (GtkWidget         *widget,
   popped_up_menu = FALSE;
 
   menu = gtk_menu_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (menu),
+                               GTK_STYLE_CLASS_CONTEXT_MENU);
 
   item = gtk_menu_item_new_with_mnemonic (_("_End Process"));
   g_signal_connect (item, "activate",
index 48a05802966d6d345da239c329f079295e8dd3c6..bc47cccf395b0dedcb84ff2a5f05ed2f76b68293 100644 (file)
@@ -7530,6 +7530,9 @@ gtk_notebook_popup_enable (GtkNotebook *notebook)
     return;
 
   priv->menu = gtk_menu_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (priv->menu),
+                               GTK_STYLE_CLASS_CONTEXT_MENU);
+
   for (list = gtk_notebook_search_page (notebook, NULL, STEP_NEXT, FALSE);
        list;
        list = gtk_notebook_search_page (notebook, list, STEP_NEXT, FALSE))
index 5a36d13d3dbe23a440f47f3818ca98120d3b9ef6..da6592e3c47354169594f80c222a30da3f5fffe4 100644 (file)
@@ -3097,6 +3097,9 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
        GFile *file;
 
        sidebar->popup_menu = gtk_menu_new ();
+       gtk_style_context_add_class (gtk_widget_get_style_context (sidebar->popup_menu),
+                                    GTK_STYLE_CLASS_CONTEXT_MENU);
+
        gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu),
                                   GTK_WIDGET (sidebar),
                                   bookmarks_popup_menu_detach_cb);
index 53aaae9729f64bafe8eecf0d531f8e0efa101980..729613c0368b0259e5264be302b70e9286f6437b 100644 (file)
@@ -258,12 +258,23 @@ struct _GtkStyleContextClass
 /**
  * GTK_STYLE_CLASS_MENU:
  *
- * A CSS class to match popup menus.
+ * A CSS class to match menus.
  *
  * This is used in #GtkMenu.
  */
 #define GTK_STYLE_CLASS_MENU "menu"
 
+/**
+ * GTK_STYLE_CLASS_CONTEXT_MENU:
+ *
+ * A CSS class to match context menus.
+ *
+ * This style class is useful when you want to prevent
+ * a context menu from inheriting e.g. font changes from
+ * the widget it is attached to.
+ */
+#define GTK_STYLE_CLASS_CONTEXT_MENU "context-menu"
+
 /**
  * GTK_STYLE_CLASS_MENUBAR:
  *
index 999e9daad178e9065698d47826b0e1943d05a091..889aab297f47b0137b2a10c9ff5d095ceb929f84 100644 (file)
@@ -8610,6 +8610,8 @@ popup_targets_received (GtkClipboard     *clipboard,
        gtk_widget_destroy (priv->popup_menu);
 
       priv->popup_menu = gtk_menu_new ();
+      gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu),
+                                   GTK_STYLE_CLASS_CONTEXT_MENU);
 
       gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu),
                                 GTK_WIDGET (text_view),
index ce78fd205b39e4eace611db6bb07f8bc79f8e21d..ac07f3e2fef920c3d05438d8bfb0b4555033d060 100644 (file)
@@ -1426,7 +1426,7 @@ rebuild_menu (GtkToolbar *toolbar)
 
   if (!priv->menu)
     {
-      priv->menu = GTK_MENU (gtk_menu_new());
+      priv->menu = GTK_MENU (gtk_menu_new ());
       gtk_menu_attach_to_widget (priv->menu,
                                 GTK_WIDGET (toolbar),
                                 menu_detached);
index e611a70b4d4b4db66d453b682ebc94a3d90c3f16..ec94c8d5ef4db7675c1cebc48bfca326105c496e 100644 (file)
@@ -7848,6 +7848,9 @@ gtk_window_do_popup (GtkWindow      *window,
     gtk_widget_destroy (priv->popup_menu);
 
   priv->popup_menu = gtk_menu_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu),
+                               GTK_STYLE_CLASS_CONTEXT_MENU);
+
   gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu),
                              GTK_WIDGET (window),
                              popup_menu_detach);